﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Configuration;
using System.Threading.Tasks;

namespace Pittypat
{
    /// <summary>
    /// <see cref="INotificationService"/> 的默认实现。当配置文件中没有配置 notificationService 时使用的默认通知服务。
    /// </summary>
    sealed class NotificationService : INotificationService
    {
        #region Current

        // 默认的通知服务，这是一个静态字段。
        static readonly NotificationService Default = new NotificationService();

        // 当前通知服务
        static INotificationService service = null;
        // 同步线程对服务的访问
        static readonly object serviceRoot = new object();

        /// <summary>
        /// 根据配置文件获取当前通知服务。
        /// </summary>
        /// <exception cref="ConfigurationErrorsException">配置文件中配置了 notificationService，但是没有找到目标配置类型。</exception>
        internal static INotificationService Current
        {
            get
            {
                if (service == null)
                {
                    lock (serviceRoot)
                    {
                        if (service == null)
                        {
                            // 配置文件中的通知服务的实现类型的名称。
                            var typeName = Configuration.PittypatConfig.Current.NotificationService;

                            if (!string.IsNullOrEmpty(typeName))
                            {
                                // 创建实现类型
                                var type = Type.GetType(typeName);
                                if (type != null)
                                {
                                    // 创建实现类型的对象实例
                                    service = Activator.CreateInstance(type) as INotificationService;
                                }
                                else
                                {
                                    // 没有找到类型时，产生一个配置错误
                                    throw new ConfigurationErrorsException(string.Format("没有找到类型为 {0} 的通知服务。", typeName));
                                }
                            }
                            else
                            {
                                service = Default;
                            }
                        }
                    }
                }

                return service;
            }
        }

        #endregion

        /// <summary>
        /// 初始化 NotificationService 类的新实例。
        /// </summary>
        NotificationService()
        {
        }

        /// <summary>
        /// 异步加载指定用户的新通知的数目。总是返回 0。
        /// </summary>
        /// <param name="userId">当前用户的 Id。</param>
        /// <param name="progress">跟踪和汇报异步操作的进度。</param>
        /// <returns>返回目标用户新通知的数目。</returns>
        Task<@int64> INotificationService.CountAsync(@uuid userId, IAsyncProgress progress)
        {
            return Task.FromResult((@int64)0L);
        }

        /// <summary>
        /// 异步加载指定用户的新通知的列表。总是返回空列表。
        /// </summary>
        /// <param name="userId">当前用户的 Id。</param>
        /// <param name="progress">跟踪和汇报异步操作的进度。</param>
        /// <returns>返回目标用户新通知的列表。</returns>
        Task<NotificationList> INotificationService.ListAsync(@uuid userId, IAsyncProgress progress)
        {
            return Task.FromResult(NotificationList.Empty);
        }

        /// <summary>
        /// 异步将指定的通知记录标记为已读。总是返回 null。
        /// </summary>
        /// <param name="userId">当前用户的 Id。</param>
        /// <param name="notificationId">要标记为已读的通知记录的 Id。</param>
        /// <param name="progress">跟踪和汇报异步操作的进度。</param>
        /// <returns>返回将消息标记为已读的时间。</returns>
        Task<datetime?> INotificationService.ReadAsync(@uuid userId, @uuid notificationId, IAsyncProgress progress)
        {
            return Task.FromResult((datetime?)null);
        }
    }
}
